package py.fpuna.ii.electiva2.server;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import py.fpuna.ii.electiva2.client.GWTServiceProd;
import py.fpuna.ii.electiva2.client.model.ProductoModel;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import py.fpuna.ii.electiva2.client.model.ProveedorModel;
import py.fpuna.ii.electiva2.dto.CompraDTO;
import py.fpuna.ii.electiva2.dto.ProductoDTO;
import py.fpuna.ii.electiva2.dto.ProveedorDTO;
import py.fpuna.ii.electiva2.interfaces.ProductoEAORemote;
import py.fpuna.ii.electiva2.interfaces.ProductoFacadeRemote;
import py.fpuna.ii.electiva2.interfaces.ProveedorEAORemote;

/**
 *
 * @author gonzaleza
 */
public class GWTServiceProdImpl extends RemoteServiceServlet implements GWTServiceProd {

    public String guardarProducto(ProductoModel prod) {
        try {
            Context ctx = new InitialContext();
            ProductoFacadeRemote prodFacadeR = (ProductoFacadeRemote) ctx.lookup("java:comp/env/ProductoFacadeBean");

            System.out.println(prod.getProdDescripcion());
            System.out.println(prod.getProdCantidad());
            System.out.println(prod.getProdProveedor().getProvCodigo());
            System.out.println(prod.getProdPrecioCompra());
            System.out.println(prod.getProdPrecioVenta());

            ProductoDTO prodDto = new ProductoDTO();
            prodDto.setProdDescripcion(prod.getProdDescripcion());
            prodDto.setProdCantidad(prod.getProdCantidad());

            ProveedorDTO prov = new ProveedorDTO(prod.getProdProveedor().getProvCodigo());
            prodDto.setProdProveedor(prov);
            
            prodDto.setProdPrecioCompra(prod.getProdPrecioCompra());
            prodDto.setProdPrecioVenta(prod.getProdPrecioVenta());
            
            Collection<CompraDTO> comp = new ArrayList<CompraDTO>();
            prodDto.setCompraCollection(comp);

            prodFacadeR.insert(prodDto);

            return "true";

        } catch (NamingException ex) {
            Logger.getLogger(GWTServiceProdImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "false";
    }


    /**
     * lista todos los productos encontrados q coinciden cn la condicion
     * @param condicion
     * @return lista de productos encontrados
     */
    public List<ProductoModel> listarProductosEncontrados(String condicion) {
        List <ProductoModel> responseList = new ArrayList<ProductoModel>();

        try {

            Context ctx = new InitialContext();
            ProductoFacadeRemote prodFacadeR = (ProductoFacadeRemote) ctx.lookup("java:comp/env/ProductoFacadeBean");

            //trae la lista de productos de la BD
            List <ProductoDTO> productoList = new ArrayList();
            try {
                productoList = prodFacadeR.getProductosEncontrados(condicion);
            } catch (Exception ex) {
                Logger.getLogger(GWTServiceProdImpl.class.getName()).log(Level.SEVERE, null, ex);
            }

            for (ProductoDTO prod : productoList){
                ProductoModel prodMod = new ProductoModel();
                prodMod.setProdCodigo(prod.getProdCodigo());
                prodMod.setProdDescripcion(prod.getProdDescripcion());
                prodMod.setProdCantidad(prod.getProdCantidad());
                prodMod.setProdPrecioCompra(prod.getProdPrecioCompra());
                prodMod.setProdPrecioVenta(prod.getProdPrecioVenta());

                ProveedorModel provModel = new ProveedorModel();
                provModel.setProvCodigo(prod.getProdProveedor().getProvCodigo());
                provModel.setProvDireccion(prod.getProdProveedor().getProvDireccion());
                provModel.setProvRazonSocial(prod.getProdProveedor().getProvRazonSocial());
                provModel.setProvTelefono(prod.getProdProveedor().getProvTelefono());
                prodMod.setProdProveedor(provModel);

                responseList.add(prodMod);
            }

            return responseList;

        } catch (NamingException ex) {
            Logger.getLogger(GWTServiceProdImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }



    public List<ProductoModel> listarProducto(){
        List <ProductoModel> responseList = new ArrayList<ProductoModel>();

        try {

            Context ctx = new InitialContext();
            ProductoFacadeRemote prodFacadeR = (ProductoFacadeRemote) ctx.lookup("java:comp/env/ProductoFacadeBean");

            //trae la lista de productos de la BD
            List <ProductoDTO> productoList = new ArrayList();
            try {
                productoList = prodFacadeR.getListaProductos(null);
            } catch (Exception ex) {
                Logger.getLogger(GWTServiceProdImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            for (ProductoDTO prod : productoList){
                ProductoModel prodMod = new ProductoModel();
                prodMod.setProdCodigo(prod.getProdCodigo());
                prodMod.setProdDescripcion(prod.getProdDescripcion());
                prodMod.setProdCantidad(prod.getProdCantidad());
                prodMod.setProdPrecioCompra(prod.getProdPrecioCompra());
                prodMod.setProdPrecioVenta(prod.getProdPrecioVenta());

                ProveedorModel provModel = new ProveedorModel();
                provModel.setProvCodigo(prod.getProdProveedor().getProvCodigo());
                provModel.setProvDireccion(prod.getProdProveedor().getProvDireccion());
                provModel.setProvRazonSocial(prod.getProdProveedor().getProvRazonSocial());
                provModel.setProvTelefono(prod.getProdProveedor().getProvTelefono());
                prodMod.setProdProveedor(provModel);

                responseList.add(prodMod);
            }
            
            return responseList;

        } catch (NamingException ex) {
            Logger.getLogger(GWTServiceProdImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }


    public String eliminarProducto(Integer idProd) {
        String res = "";
        try {
            Context ctx = new InitialContext();
            ProductoEAORemote productoEaoR = (ProductoEAORemote) ctx.lookup("java:comp/env/ProductoEAOBean");

            ProductoDTO prodDto = productoEaoR.find(idProd);
            productoEaoR.remove(prodDto);
            
            res = "eliminado";
        } catch (NamingException ex) {
            Logger.getLogger(GWTServiceProdImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

        return res;
    }

    public String modificarProducto(Integer idProd, ProductoModel prod) {
        try {
            Context ctx = new InitialContext();
            ProductoEAORemote productoEaoR = (ProductoEAORemote) ctx.lookup("java:comp/env/ProductoEAOBean");

            ProductoDTO prodDto = productoEaoR.find(idProd);

            prodDto.setProdDescripcion(prod.getProdDescripcion());
            prodDto.setProdCantidad(prod.getProdCantidad());
            prodDto.setProdPrecioCompra(prod.getProdPrecioCompra());
            prodDto.setProdPrecioVenta(prod.getProdPrecioVenta());

            ProveedorEAORemote provEaoR = (ProveedorEAORemote) ctx.lookup("java:comp/env/ProveedorEAOBean");
            ProveedorDTO provdto = provEaoR.find(prod.getProdProveedor().getProvCodigo());
            
            prodDto.setProdProveedor(provdto);
            
            productoEaoR.edit(prodDto);

            return "modificado";

        }catch (NamingException ex) {
            Logger.getLogger(GWTServiceProdImpl.class.getName()).log(Level.SEVERE, null, ex);
        
        }

        return "no modificado";
    }


    public List<ProveedorModel> listarProveedores() {
        List <ProveedorModel> responseList = new ArrayList<ProveedorModel>();

        try {

            Context ctx = new InitialContext();
            ProductoFacadeRemote productoFacadeR = (ProductoFacadeRemote) ctx.lookup("java:comp/env/ProductoFacadeBean");

            //trae la lista de clientes de la BD
            List <ProveedorDTO> provList = new ArrayList<ProveedorDTO>();

            provList = productoFacadeR.listarProveedores();

            for (ProveedorDTO prov : provList){
                ProveedorModel provmod = new ProveedorModel();
                provmod.setProvCodigo(prov.getProvCodigo());
                provmod.setProvRazonSocial(prov.getProvRazonSocial());
                provmod.setProvDireccion(prov.getProvDireccion());
                provmod.setProvTelefono(prov.getProvTelefono());
                responseList.add(provmod);
            }

            return responseList;

        } catch (NamingException ex) {
            Logger.getLogger(GWTServiceProdImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }
    
    
    public ProductoModel cargarProductoCompra(Integer codproducto)
    {

        try {
            Context ctx = new InitialContext();
            ProductoEAORemote productoEaoR = (ProductoEAORemote) ctx.lookup("java:comp/env/ProductoEAOBean");
            ProductoModel res = new ProductoModel();
            ProductoDTO prodDto = productoEaoR.find(codproducto);

            res.setProdCantidad(prodDto.getProdCantidad());
            res.setProdCodigo(prodDto.getProdCodigo());
            res.setProdDescripcion(prodDto.getProdDescripcion());
            res.setProdPrecioCompra(prodDto.getProdPrecioCompra());
            res.setProdPrecioVenta(prodDto.getProdPrecioVenta());

            return res;

        } catch (NamingException ex) {
            Logger.getLogger(GWTServiceProvImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;

    }




}
